{"componentChunkName":"component---src-templates-blog-post-js","path":"/Building-a-language-switch-component-in-React/","result":{"data":{"site":{"siteMetadata":{"title":"Aleks Popovic - personal website and blog"}},"markdownRemark":{"id":"c10d6545-4318-51c3-9114-8e29bf75c980","excerpt":"You have all of your multilingual pages set up, but now you need to give your users a way to access those pages. There are multiple ways this can be done. The…","html":"<p>You have all of your multilingual pages set up, but now you need to give your users a way to access those pages. There are multiple ways this can be done. The most common solution is adding a language selection tool in the form of multiple links or by using a drop-down list.</p>\n<p>In my case - I had to implement three different languages, so I went with the buttons approach.</p>\n<p>First things first - we need to create a new component called LanguageSwitch (or whatever you find to be more appropriate for your use-case).</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">LanguageSwitch</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> language<span class=\"token punctuation\">,</span> location <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> LanguageSwitch</code></pre></div>\n<p>The component takes in two parameters. Language is the language code string that you can pass in on each page. Location is the standard location prop that every page component in Gatsby has access to. Here is how you can grab it and pass it down on a default home page.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> LanguageSwitch <span class=\"token keyword\">from</span> <span class=\"token string\">\"../components/languageSwitch\"</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Index</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">LanguageSwitch</span></span> <span class=\"token attr-name\">language</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>en<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">location</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>location<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Index</code></pre></div>\n<p>For showing the language Urls I wanted to make a system that displays only the languages that should be available for clicking, since having three buttons visible all the time would be a bit cluttered. So, if the user was currently on an English page he would see the buttons for other two languages, but not the English one.</p>\n<p>For that to work I would need a way to reference available languages by their language code and display appropriate label on the button, so this is what I did.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">LanguageSwitch</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> language<span class=\"token punctuation\">,</span> location <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">let</span> languageList <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> sr<span class=\"token operator\">:</span> <span class=\"token string\">\"srpski\"</span><span class=\"token punctuation\">,</span> en<span class=\"token operator\">:</span> <span class=\"token string\">\"English\"</span><span class=\"token punctuation\">,</span> el<span class=\"token operator\">:</span> <span class=\"token string\">\"Ελληνικα\"</span> <span class=\"token punctuation\">}</span></span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">let</span> links <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>links<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> LanguageSwitch</code></pre></div>\n<p>I added an object which keys were the language codes, and the values were the button or link labels. I also added an array for storing the links and returning them to the page once we figure out which ones need to be shown. Next thing was figuring out the page Url for each button.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">LanguageSwitch</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> language<span class=\"token punctuation\">,</span> location <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> languageList <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> sr<span class=\"token operator\">:</span> <span class=\"token string\">\"srpski\"</span><span class=\"token punctuation\">,</span> en<span class=\"token operator\">:</span> <span class=\"token string\">\"English\"</span><span class=\"token punctuation\">,</span> el<span class=\"token operator\">:</span> <span class=\"token string\">\"Ελληνικα\"</span> <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">let</span> links <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n  <span class=\"token keyword\">let</span> pageName <span class=\"token operator\">=</span> location<span class=\"token punctuation\">.</span>pathname\n\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>pageName<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/el\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> pageName<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/sr\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    pageName <span class=\"token operator\">=</span> pageName<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span></span>\n  <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>links<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> LanguageSwitch</code></pre></div>\n<p>Let’s say we open up the contact page with Greek content. The location.pathname will be <em>/el/contact/</em>. Splitting that string gives us an array with four items.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\">exampleArray <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"el\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"contact\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>The page name is the value with index of 2, so that’s what we grab. If we were currently on the English contact page (which in my case doesn’t have the language code prefix) then location.pathname would equal to <em>/contact/</em> and that’s exactly what we want. There is no need to extract the page from that string, so that’s why we add a condition before the split.</p>\n<p>The only thing left to do is generating the appropriate Urls.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Link <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"gatsby\"</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">LanguageSwitch</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> language<span class=\"token punctuation\">,</span> location <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> languageList <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> sr<span class=\"token operator\">:</span> <span class=\"token string\">\"srpski\"</span><span class=\"token punctuation\">,</span> en<span class=\"token operator\">:</span> <span class=\"token string\">\"English\"</span><span class=\"token punctuation\">,</span> el<span class=\"token operator\">:</span> <span class=\"token string\">\"Ελληνικα\"</span> <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">let</span> links <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n  <span class=\"token keyword\">let</span> pageName <span class=\"token operator\">=</span> location<span class=\"token punctuation\">.</span>pathname\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>pageName<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/el\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> pageName<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/sr\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    pageName <span class=\"token operator\">=</span> pageName<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> key <span class=\"token keyword\">in</span> languageList<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>key <span class=\"token operator\">!==</span> language<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token keyword\">let</span> languagePath <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span></span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>key <span class=\"token operator\">!==</span> <span class=\"token string\">\"en\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">        languagePath <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>key<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">/</span><span class=\"token template-punctuation string\">`</span></span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token punctuation\">}</span></span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token keyword\">let</span> link <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span></span><span class=\"gatsby-highlight-code-line\">        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>key<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">to</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>languagePath<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">          </span><span class=\"token punctuation\">{</span>languageList<span class=\"token punctuation\">[</span>key<span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token punctuation\">)</span></span>\n<span class=\"gatsby-highlight-code-line\">      links<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>link<span class=\"token punctuation\">)</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token punctuation\">}</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span></span>\n  <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>links<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> LanguageSwitch</code></pre></div>\n<p>We go through the languageList object to check if the Url needs to be generated. For English pages we don’t need to add a prefix, but for other languages we set languagePath to the appropriate language key code.</p>\n<p>Then we create a new Link, which is a built-in Gatsby component used for linking internal pages. Link’s “to” property is what we would add as “src” in a regular &#x3C;a> tag. In this case we combine the language key code and the page name which we found earlier. Between the Link tags we add our link’s text, which is in this case the language label that we get from the languageList object.</p>\n<p>In the end we push the link to our return array and that’s it. Of course, the links are going to have your default Url styling since we didn’t add any specific css to them, but you can always set them up however you want by adding some css.</p>\n<h2>Simpler solution</h2>\n<p>What if you don’t want a language switch with a huge number of buttons because you are implementing only 2 different languages? Then there’s probably no need to go to the trouble of hiding any buttons, and you can just show both choices at the same time. I ended up doing this in the end since client’s requirements changed and they wanted only English and Greek options.</p>\n<p>Here is what that code would look like.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Link <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"gatsby\"</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">LanguageSwitch</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> location <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> pageName <span class=\"token operator\">=</span> location<span class=\"token punctuation\">.</span>pathname\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>pageName<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/el\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    pageName <span class=\"token operator\">=</span> pageName<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">let</span> greekPagePath <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/el/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">to</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>pageName<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">English</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">to</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>greekPagePath<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Ελληνικα</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> LanguageSwitch</code></pre></div>\n<p>Much simpler. First of all, we don’t need to pass in the language as a parameter any more, because we don’t need to hide any options. We also don’t need an object with all language key codes and labels. We pick up the location.pathname for the English pageName and we split it for the Greek version as before. Then we simply return both Links since we don’t have to go through a loop.</p>\n<h2>Country flags instead of labels</h2>\n<p>If you want to use flag images as buttons instead of language labels, you can do that too. Just import your images, replace them with labels and you should end up with something like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Link <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"gatsby\"</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> greekFlag <span class=\"token keyword\">from</span> <span class=\"token string\">\"../assets/greece.svg\"</span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> ukFlag <span class=\"token keyword\">from</span> <span class=\"token string\">\"../assets/uk.svg\"</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">LanguageSelector</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> location <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> pageName <span class=\"token operator\">=</span> location<span class=\"token punctuation\">.</span>pathname\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>pageName<span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/el\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    pageName <span class=\"token operator\">=</span> pageName<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">let</span> greekPagePath <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">/el/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">to</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>pageName<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ukFlag<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>english language<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Link</span></span> <span class=\"token attr-name\">to</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>greekPagePath<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">src</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>greekFlag<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>greek language<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Link</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> LanguageSelector</code></pre></div>\n<p>You will probably need to adjust the way your images are rendered with some additional css, but that’s a completely different topic.</p>\n<h2>What’s next?</h2>\n<p>So far so good. We have set up our page structure one way or another and we have a component that can handle switching our website’s language. Our page and component translations are still not set up and this is something we will cover in the <a href=\"/Translating-React-components/\">last part of this series</a>. We will go over a couple of examples explaining what are some easy ways to set up our language data to be accessible throughout all of our pages. We will also cover how to translate regular components, such as a main navigation menu.</p>\n<hr>\n<div class=\"sectionHighlight\">If you have any questions or comments you can reach out to me on <a href=\"https://twitter.com/alekswritescode\" target=\"_blank\" rel=\"noopener noreferrer\">Twitter</a> and <a href=\"https://www.instagram.com/aleks.popovic/\" target=\"_blank\" rel=\"noopener noreferrer\">Instagram</a>, where I also post interesting code tidbits and designs.\n<p>I also have a <a href=\"https://www.youtube.com/AleksPopovic\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube channel</a> where I regularly upload React and web dev tutorials, so if that’s your cup of tea feel free to support me by subscribing.</div></p>","frontmatter":{"title":"Building a language switch component in React","series":"How to Build a Multilingual Website with Gatsby and React","seriesLink":"multilingual","date":"August 14, 2020","description":"You have all of your multilingual pages set up, but now you need to give your users a way to access those pages. There are multiple ways this can be done. The most common solution is adding a language selection tool in the form of multiple links or by using a drop-down list. In my case - I had to implement three different languages, so I went with the buttons approach.","tags":["web","react","multilingual"],"featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACIUlEQVQozw2SWW8ScRTF+YK+qYm1Mamp1AfTVrtYrXYz2h0oLdKBsHegsk2GMsAMLVuBsnSAUoj2TV/8Cj7+/D+c3Htzck9uzj2WG3WDenqdjvKRZmabjnFMvxJmfH3GfTWMWQrRLwUwDYmu7sMsSPw2Ff70NEb1EKbupn8lcSP4ataBpaVs0cgd0c4dc1cKCjLCqCJzX/FxXw4KUZmuEaZthKhpEkrggHFZ4ud1kErWRyXtoKLsUM85aV7sYummvtFK71NNukmrMWwZAykeoBaQiMzKSM/TAlF801FOJuM4Xzrp5L/S15bpqIt0MmtidtDKuWgkV7HIPwLYlTyL+pDXFyXmVZUnUgp1z0/0jUzoVQxpUiYy40Z6KuOf36Cq7jPUdmknVmlE52idT1OOrpAPH2FZy9X5MPqHtfGXOa2GI5sgroe5CgfxvFAJTkUIWCN4pqLk7SvEXbOUEk7GlzbGxR3M1DqX3rcU/Uu0k1+wnKtJNhWDaMLLteZhoDv5pW9RPHERsoZRV13EF06JWXe5dE+QPHpGP3vAoHjKoGBjmF3iNj4vrpyjJ09gGRhehkaAOz0ifPBTK/hpaG5h8DHtvI1m4bvoxRdTm+j+GSKHVm7VzzyUt0XdY5haEN4tc+N/TN37CEtTOxGLpyIeZwwE2kK0a3jo6Q5uM5uYmU/UlEPKiT2M0DKyfZpe+j0PIl69vJ1xYYeR8o5B+DFmbIb/fcrZLzxbYNUAAAAASUVORK5CYII=","aspectRatio":2.6666666666666665,"src":"/static/b4540dc780b9271335e7b48d0014a453/0e6e2/switch.png","srcSet":"/static/b4540dc780b9271335e7b48d0014a453/b460a/switch.png 480w,\n/static/b4540dc780b9271335e7b48d0014a453/6e898/switch.png 960w,\n/static/b4540dc780b9271335e7b48d0014a453/0e6e2/switch.png 1920w","srcWebp":"/static/b4540dc780b9271335e7b48d0014a453/30cf3/switch.webp","srcSetWebp":"/static/b4540dc780b9271335e7b48d0014a453/35871/switch.webp 480w,\n/static/b4540dc780b9271335e7b48d0014a453/fcc10/switch.webp 960w,\n/static/b4540dc780b9271335e7b48d0014a453/30cf3/switch.webp 1920w","sizes":"(max-width: 1920px) 100vw, 1920px"}}}}}},"pageContext":{"slug":"/Building-a-language-switch-component-in-React/","previous":{"excerpt":"Before going ahead and making a multilingual website I would advise you to think about a few things: Do you even need one? Are you prepared…","fields":{"slug":"/Setting-up-page-structure-for-a-multilingual-website-in-Gatsby-and-React/"},"frontmatter":{"date":"August 05, 2020","title":"Setting up page structure for a multilingual website","series":"How to Build a Multilingual Website with Gatsby and React","description":"Before going ahead and making a multilingual website I would advise you to think about a few things. Do you even need one? Are you prepared to make multilingual content on your own? What is the best way to handle various translations? The first two points really matter only if you are making a personal project. If you were contracted to make a multilingual site for someone else then they are the ones who need to think about it.","tags":["gatsby","web","react","multilingual"],"featuredImage":{"id":"ad4b1aca-c21b-58d6-b075-a54e60942c20","publicURL":"/static/62314cdf6f6a00bf234dd2a5e569228a/structure.png","relativeDirectory":"Setting-up-page-structure-for-a-multilingual-website-in-Gatsby-and-React","relativePath":"Setting-up-page-structure-for-a-multilingual-website-in-Gatsby-and-React/structure.png"}}},"next":{"excerpt":"Having different page files for different languages makes all of the page translations pretty contained and easy for access if something…","fields":{"slug":"/Translating-React-components/"},"frontmatter":{"date":"August 16, 2020","title":"Translating React components","series":"How to Build a Multilingual Website with Gatsby and React","description":"Having different page files for different languages makes all of the page translations pretty contained and easy for access if something needs to be changed or added later on. Separating page components is good because of searching algorithms and SEO. There is also no code duplication, since page components are mostly plain text or markdown. Non-page components are a bit different.","tags":["web","react","multilingual"],"featuredImage":{"id":"a3034fe9-222e-533f-93ea-8fe775679692","publicURL":"/static/23e2c2b486f8733000f90e001c759f59/translating.png","relativeDirectory":"Translating-React-components","relativePath":"Translating-React-components/translating.png"}}}}}}